package cl.inmotion.support.bitacora.view.servlets.bitacora;

import java.io.IOException;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cl.inmotion.support.bitacora.dao.ClienteDAO;
import cl.inmotion.support.bitacora.dao.RegistroDAO;
import cl.inmotion.support.bitacora.dao.UsuarioDAO;
import cl.inmotion.support.bitacora.dao.exceptions.ClienteNotFoundException;

@WebServlet("/filtroBitacora")
public class FiltroBitacora extends HttpServlet {

	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		/* Usuario en session */
		UsuarioDAO user = (UsuarioDAO) req.getSession().getAttribute("user");
		List<RegistroDAO> registros = new ArrayList<RegistroDAO>();

		/* Se recuperan los parametros de busqueda */
		String idClienteField = req.getParameter("cliente");
		String fechaDesdeField = req.getParameter("fechaDesde");
		String fechaHastaField = req.getParameter("fechaHasta");

		/* CASO: SOLO CLIENTE */
		if ((idClienteField != null) && (fechaDesdeField.equals(""))
				&& (fechaHastaField.equals(""))) {

			/* Se obtiene el cliente */
			ClienteDAO cliente;
			try {
				cliente = ClienteDAO.getCliente(Long.parseLong(idClienteField));
			} catch (NumberFormatException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				req.getRequestDispatcher("/WEB-INF/jsp/Error.jsp").forward(req,
						resp);
				return;
			} catch (ClienteNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				req.getRequestDispatcher("/WEB-INF/jsp/Error.jsp").forward(req,
						resp);
				return;
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				req.getRequestDispatcher("/WEB-INF/jsp/Error.jsp").forward(req,
						resp);
				return;
			}
			try {
				registros = cliente.getRegistros(user);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				req.getRequestDispatcher("/WEB-INF/jsp/Error.jsp").forward(req,
						resp);
				return;
			}
		}

		/* CASO SOLO FECHAS */
		else if (idClienteField.equals("0") && (fechaDesdeField != null)
				&& (fechaHastaField != null)) {

			DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
			Date fechaDesde, fechaHasta;
			try {
				fechaDesde = formatter.parse(fechaDesdeField);
				fechaHasta = formatter.parse(fechaHastaField);
			} catch (ParseException e) {
				e.printStackTrace();
				req.getRequestDispatcher("/WEB-INF/jsp/Error.jsp").forward(req,
						resp);
				return;
			}

			try {
				registros = user.getRegistros(fechaDesde, fechaHasta);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				req.getRequestDispatcher("/WEB-INF/jsp/Error.jsp").forward(req,
						resp);
				return;
			}
		}

		/* CASO FECHAS Y CLIENTE */
		else if ((idClienteField != null) && (fechaDesdeField != null)
				&& (fechaHastaField != null)) {

			/* Recuperar el cliente */
			ClienteDAO cliente;
			try {
				cliente = ClienteDAO.getCliente(Long.parseLong(idClienteField));
			} catch (NumberFormatException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				req.getRequestDispatcher("/WEB-INF/jsp/Error.jsp").forward(req,
						resp);
				return;
			} catch (ClienteNotFoundException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				req.getRequestDispatcher("/WEB-INF/jsp/Error.jsp").forward(req,
						resp);
				return;
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
				req.getRequestDispatcher("/WEB-INF/jsp/Error.jsp").forward(req,
						resp);
				return;
			}

			/* Y las fechas */
			DateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
			Date fechaDesde, fechaHasta;
			try {
				fechaDesde = formatter.parse(fechaDesdeField);
				fechaHasta = formatter.parse(fechaHastaField);
			} catch (ParseException e) {
				e.printStackTrace();
				req.getRequestDispatcher("/WEB-INF/jsp/Error.jsp").forward(req,
						resp);
				return;
			}

			try {
				registros = user.getRegistros(fechaDesde, fechaHasta, cliente);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				req.getRequestDispatcher("/WEB-INF/jsp/Error.jsp").forward(req,
						resp);
				return;
			}
		}

		/* Se setean los registros y se redirecciona a la bitacora */
		req.setAttribute("registros", registros);
		req.getRequestDispatcher("/WEB-INF/jsp/bitacora/Registro.jsp")
				.forward(req, resp);
	}

}
